package lang;

/**
 * @author xiaoming
 * @version 1.0
 * @date 2018/11/29 23:49
 * java.lang.Integer 类
 * 文档: https://docs.oracle.com/javase/8/docs/api/java/lang/Integer.html
 **/
public class IntegerLang {

    public void classDefine() {

        /*
        ## 一、类定义
        public final class Integer extends Number implements Comparable<Integer>
         1. final : 不能被继承;
         2. extends Number : 可以调用 byteVale, doubleValue,floatValue,intValue, longValue, shortValue对应类型的值;
         3. implements Comparable<Integer> :可以调用compareTo 进行同类型比较.
         */
        System.out.println("一、类定义:");
        System.out.println(" public final class Integer extends Number implements Comparable<Integer>");
    }

    public void field() {
        /*
        ## 二、属性
        1. 私有属性,
        1.1  private final int value;
            用于保存Integer的实际int值, final 类型,说明Integer一旦被初始化就无法改变value值
        */
        Integer i = new Integer(2);
        i = 5;
        System.out.println(i);  // 5
        /*
        通过javap -c 或者jd 反编译后, 发现是调用了valueOf(int)返回了一个对象, 而并没有直接改变value值:
            Integer localInteger = new Integer(2);
            localInteger = Integer.valueOf(5);

        1.2 serialVersionUID 序列化

        2. 公有属性
        2.1 BYTES
            二进制补码形式表示 int 值的字节数。@since 1.8
            public static final int BYTES = SIZE / Byte.SIZE;
        2.2 MAX_VALUE
            int 类型能够表示的最大值 2^31
            @Native public static final int   MAX_VALUE = 0x7fffffff;
        2.3 MIN_VALUE  2^31
            @Native public static final int   MIN_VALUE = 0x80000000;

            @Native : @since1.8 指示可以从本机代码引用定义常量值的字段。
            注释可以用作生成本机头文件的工具的提示，以确定是否需要头文件，如果需要，它应该包含哪些声明。
        2.4 SIZE
            用来以二进制补码形式表示 int 值的比特位数。
            @Native public static final int SIZE = 32;
        2.5 TYPE
            代表的原始数据类型int 的Class实例
            public static final Class<Integer>  TYPE = (Class<Integer>) Class.getPrimitiveClass("int");
         */
        System.out.println("二.公有属性:");
        System.out.println("SIZE:" + Integer.SIZE );
        System.out.println("BYTES:" + Integer.BYTES);
        System.out.println("MIN_VALUE MAX_VALUE:" + Integer.MIN_VALUE + " / " + Integer.MAX_VALUE);
        System.out.println("TYPE: " + Integer.TYPE);

    }
    public void contructor() {
        /*
        ## 三、构造方法
          初始化时给私有属性value赋值;
          参数为字符串时, 需要一个数字的字符串, 否则异常 NumberFormatException,
          其实现利用了Character.digit(int,int radix), 基数radix设置默认值10, 即只能初始化10进制数
         */
        System.out.println("三、构造方法:");
        Integer integer = new Integer(123);
        Integer integer1 = new Integer("213123");
    }

    public void method() {
        Integer integer = new Integer(123);
        Integer integer1 = new Integer("213123");
        /*
        ## 四、其他方法
        1. toString
        String toString(int i, int radix)          返回指定进制(radix)的字符串
            如: 转换为十进制的字符串 toString(int i, 10)
            (还不懂) Unsigned
        String toUnsignedString(int i, int radix)  无符号的字符串 (Long中的方法实现)
            如: 以无符号十进制值的形式返回参数的字符串表示形式 toUnsignedString(int i, 10)
        String toHexString(int i)                  返回十六进制字符串 ,shift=4
        String toOctalString(int i)                返回8进制字符串 , shift=3
        String toBinaryString(int i)               返回二进制字符串, shift=1

        2. parseInt
        public static int parseInt(String s, int radix)
        int parseUnsignedInt(String s, int radix)    无符号整数
        int parseUnsignedInt(String s, 10)

        // NumberFormatException "-12" 不能为"-"
        //System.out.println("parseUnsignedInt: " +  Integer.parseUnsignedInt("-12", 10));

        3. valueOf 返回指定值的 Integer实例
        static Integer valueOf(int i)
            用到内部类IntegerCache   range[-128 , 127], assert
            // Integer缓存策略 sun.misc.VM.getSavedProperty
            Integer缓存数组
            如果在缓存范围内则直接返回, 否则new一个
        static Integer valueOf(String s)
            return : valueOf(parseInt(s,10));
        Integer valueOf(String s, int radis)
            return : valueOf(parseInt(s,radis));
        */
        System.out.println("3. valueOf: " + Integer.valueOf(128));
        System.out.println("valueOf('-128'): " + Integer.valueOf("-128"));

        /*
        4. byte byteValue()
        short shorValue()
        int intVaue()
        long longValue()
        int intValue()
        float floatValue()
        double doubleValue()
        通过int的类型转换, Integer中的value静态变量存储int值
        注意范围
         */


        System.out.println("4. byteValue: " + integer.byteValue() + " / " + integer1.byteValue());
        /*
        5. equals(Object obj)
            先判断类型 instanceof, 再判断值
        6.getInteger
        nm :  property name

        Determines the integer value of the system property with the specified name.
        static Integer getInteger(String nm)

        Determines the integer value of the system property with the specified name.
        static Integer getInteger(String nm, int val)

        Returns the integer value of the system property with the  specified name.
        返回指定integer系统属性名称的的值  ??? 从内存里面拿?
        static Integer getInteger(String nm, Integer val)
        */
        /*

        比较两个int的值
         */
        Integer.compare(1, 3);  // ( < : -1 )or ( = : 0 ) or ( > :  1)

        System.out.println("四、其他方法:");
    }

    public static void main(String[] args) {
        IntegerLang integerLang = new IntegerLang();
        integerLang.classDefine();
        integerLang.field();
        integerLang.contructor();
        integerLang.method();

    }
}
